/**
 * Project 67th
 */


#ifndef _THREADPOOL_H
#define _THREADPOOL_H

#include "TaskQueue.h"
#include <thread>
#include <vector>
using std::thread;
using std::vector;

class ThreadPool {
public: 

    /**
     * @param threadNum
     * @param queSize
     */
    ThreadPool(size_t threadNum, size_t queSize);
    ~ThreadPool();

    //线程池启动与关闭
    void start();
    void stop();

    /**
     * @param pt
     */
    //生产者线程往线程池的任务队列中添加任务
    void addTask(ElemType pt);

private:
    //在doTask中执行，工作线程从任务队列中取走任务
    ElemType getTask();
    //被注册为工作线程的入口函数
    void doTask();

private: 
    size_t _threadNum; //线程池中子线程（工作线程）的数目
    vector<thread> _threads; //存放子线程的容器
    size_t _queSize; //任务队列中任务数上限
    TaskQueue _taskQueue; //任务队列
    bool _isExit; //线程池退出的标志
};

#endif //_THREADPOOL_H
